
天邊那一抹晚霞暮紫漸漸暗了下來,晚風吹拂著院子裡的樹葉,沙沙作響。
阿公捧著那只溫熱的茶杯,喝了一口溫潤的琥珀熱茶,在藤椅深棕的舊藤椅上微微挪了挪身子。看著懂事的大孫女仍在貼心地搥背,小孫女則像隻小綿羊一樣,依偎在阿公膝頭,那頭襯著月光的白髮銀霜,顯得格外慈祥。
「乖孫女啊,昨天阿公跟你們講了怎麼用 Plotly Dash 蓋好那座百億級的財務大橋。今天阿公接著給你們講講 Day 11 的功課:大額財務數據的極致可視化,也就是 TOP N 排序與『億元換算』的學問。」
阿公瞇起眼睛,慢條斯理地摸摸小孫女的頭,聲音像冬日裡的陽光一樣溫暖:
「大孫女,你想想看,當公司一年有幾百億的流水、上百個科目在變動時,財務主管或大掌櫃坐在高位上,他哪有心思去數那幾毛錢的尾數?」
「如果報表上寫著 $1,245,678,901.23,密密麻麻的一大串,大掌櫃看著,就跟要在稻穀堆裡數沙子一樣累人。他其實不想知道那個 .23 元,他只想看『這筆是 12.46 億元』。看得懂大局,才能下對決策。」
「而且,上百個科目裡,多數都平平穩穩、沒什麼動靜。大掌櫃最急著想知道的,是哪幾個科目波動最劇烈、最異常。如果能把那波動最大的前 5 名(TOP 5)科目直接像大路標一樣置頂,大掌櫃一眼看過去,就知道哪裡有火要滅,這才是真正體貼使用者的好系統。」
為了讓這百億級的系統變得既體貼又聰明,我們得在 Plotly Dash 裡用 Python 實作這套極致的可視化邏輯:
我們在前端版面上放一個下拉選單 dcc.Dropdown,讓大掌櫃自由切換「元」、「千元」或「億元」。
100,000,000(1e8),並預設四捨五入保留 2 位小數。(億元) 或 (元) 的字樣,讓看報表的人不會產生誤會。大掌櫃可以透過另一個下拉選單選擇他要看 TOP 5、TOP 10 還是 TOP 20。
abs(Closing - Opening)」 或 「波動百分比」 進行 sort_values(ascending=False) 降序排列,只切出前 N 筆,並即時塞入 dcc.Graph 繪製成長條圖。這樣一來,波動最劇烈的科目永遠會乖乖地排在最上面。當大掌櫃在長條圖上,看到某個會計科目(例如:應收帳款)波動了十幾億,覺得不對勁時,他不需要去別的頁面查。
clickData 屬性。當使用者點擊圖中的某個長條時,Callback 就會即時抓到被點擊的「會計科目代碼」。dash_table.DataTable 裡即時展開。大掌櫃點一下,就能像剝洋蔥一樣,層層深入看到最底層的變動明細。「大孫女啊,阿公要特別叮嚀你一個寫財務軟體最容易踩到的『隱藏坑』,這可是關乎信任的大事:」
「當我們把幾百個科目、幾萬筆明細,通通除以一億(1e8)並保留兩位小數時,四捨五入的微小差額就會在後面悄悄累積。這時,如果你把所有換算成『億元』的子項目金額加總起來,可能跟總帳的億元數會差個 0.01 億或 0.02 億(相當於一、兩百萬元)。」
「那些細心的審計人員或者大掌櫃身邊的老帳房,他們眼睛尖得像老鷹一樣。一發現子項加總跟總計對不上,哪怕只差那一文錢,他們也會懷疑:『這系統算得不準,是不是底層邏輯有漏洞?』,那你的系統就失去信任了。」
阿公的避坑法寶:
「備註:本報表金額依指定單位換算並四捨五入至小數點後兩位呈現,若有尾差,係屬四捨五入差額調整。」
小孫女這時打起了一個小小的哈欠,把臉貼在阿公的藤椅上,阿公笑著拍拍她,拿起茶杯,慢條斯理地說:
「做系統、算帳目,就跟阿公泡茶一樣。水溫要夠、茶葉要放得剛好,細節都要注意到,倒出來的茶才會香。大孫女,今天這 TOP N 和單位換算的學問,你都記在心裡了嗎?」